<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            递归--（难点-）
                递归就是函数自己调用自己


                无限制的递归会报错
                // 超过了最大调用堆栈大小
             RangeError: Maximum call stack size exceeded

             死递归 就类似于死循环--但是会报错 --爆栈
        
        */
        // function box() {
        //     console.log('11');
        //     box();
        //     console.log('22');

        //     // 超过了最大调用堆栈（内存）大小
        //     // RangeError: Maximum call stack size exceeded
        //     // 范围错误：
        // }
        // box()
        /*
            box（）
            var n=0
            log（0）
            n=1；

            box()
            log(1)
            n=2

            box()
            log(2)
            n=3

            box()
            log(3)
            n=4

            box（）
            log（4）
            n=5
            return --这个box 就结束--
        
        */

        /*
            递归--有意义的
                能实现根循环一样的效果（能用循环就用循环）
        
        */
        /* 
         var n = 0;
         function box() {
             console.log(n);//0 1 2 3 4 5
             n++;
             if (n == 5) {
                 // 想要结束递归得用return
                 return;
             } else {
                 box()
             }
         }
 
         box()
 
         console.log(111); */


        // function box(n) {
        //     console.log(n);//0  2 3 4 5
        //     if (n == 5) {
        //         return
        //     } else {
        //         box(n + 1)
        //     }
        // }
        // box(0)


        // 结合 数学公式--递归 
        // 递推式
        // 前n项和的递推式 
        // 1+2+3+4+5+ n 
        // a(n) = a(n-1) +  n
        // 前n项和 ==  前n-1项的和 +  n
        // a(5) = a(4) + 5=15
        //        a(4)=a(3)+4=10
        //               a(3)=a(2)+3=6
        //                     a(2)=a(1)+2=3
        //                          a(1)=1

        // a(n) = a(n-1) +  n
        // 递归
        // 1- 前一项和后一项关系
        // 2- 这个关系写成js代码
        // 3- 临界条件-》口算出来
        function a(n) {
            n//5 4 3 2 1 0 -1 ......
            if (n == 1) {
                return 1;
            } else {
                return a(n - 1) + n;
            }
        }
        var r = a(5);
        console.log(r);
    </script>

</body>

</html>